package design.pattern.singleton.demo8;

/**
 * 懒汉式，双重检查锁。另外在构造方法中添加了防止通过序列化和反序列化破坏单例模式的代码
 *
 * @author AtoVio, Winter Yuan
 */
public class Singleton {

    // volatile 修饰变量名，保证变量的可见性和有序性
    private static volatile Singleton instance;

    private Singleton() {
        // 防止反射破解单例模式需要添加的代码
        synchronized (Singleton.class) {
            if (instance != null) {
                throw new RuntimeException("不能创建多个对象");
            }
        }
    }

    public static Singleton getInstance() {
        // 第一次判断，如果instance为null，才需要抢占锁
        if (instance == null) {
            synchronized (Singleton.class) {
                // 第二次判断
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
